#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

#include<iostream>                                       
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<assert.h>

#define NUM 1024

struct MyFILE_
{
	int fd;
	char buffer[NUM];
	int end;
};

typedef struct MyFILE_ MyFILE;

MyFILE * fopen_(const char* pathname, const char* mode)
{
    assert(pathname && mode);
    MyFILE * fp = NULL;
    if (strcmp(mode, "r") == 0)
    {

	}
    else if (strcmp(mode, "r+") == 0)
    {

	}
    else if (strcmp(mode, "w") == 0)
    {
        umask(0);
        int fd = open(pathname, O_WRONLY | O_CREAT | O_TRUNC, 0    666);
        if (fd >= 0)
	    {
	            fp = (MyFILE*)malloc(sizeof(MyFILE));
	            memset(fp, 0, sizeof(MyFILE));
	            fp->fd = fd;
	    }
    }
    else if (strcmp(mode, "w+") == 0)
    {
	    }
    else if (strcmp(mode, "a") == 0)
    {

	}
    else if (strcmp(mode, "a+") == 0)
    {

	        }
        return fp;
    }

void fputs_(const char* str, MyFILE* _fp)
{
    assert(str && _fp);
    strcpy(_fp->buffer + _fp->end, str);
    _fp->end += strlen(str);
    if (_fp->fd == 0)
    {
        
    }
    else if (_fp->fd == 1)
    {
        if (_fp->buffer[_fp->end - 1] == '\n')
        {
            write(_fp->fd, _fp->buffer, _fp->end);
            _fp->end = 0;
        }
    }
    else if (_fp->fd == 2)
        {
        
        }
    else
    {
        cout << _fp->buffer << endl;
    }
}


void fflush_(MyFILE * _fp)
{
    assert(_fp);
    if (_fp->end)
    {
        write(_fp->fd, _fp->buffer, _fp->end);
        syncfs(_fp->fd);
        _fp->end = 0;
    }
}

void fclose_(MyFILE * _fp)
{
    assert(_fp);
    fflush_(_fp);
    close(_fp->fd);
    free(_fp);
}

int main()
{
    close(1);
    MyFILE * fp = fopen_("log.txt", "w");
    if (!fp)
    {
        perror("fopen_ error!");
        return 1;
    }
    fputs_("hello fputs!0\n", fp);
    fputs_("hello fputs!1", fp);
    fputs_("hello fputs!2\n", fp);
    fputs_("hello fputs!3", fp);
    fputs_("hello fputs!4\n", fp);
    fclose_(fp);
    return 0;
}



//int main()
//{
//	char arr[20];
//	scanf("%s",arr);
//	cout << strlen(arr) << endl;
//	int h = strlen(arr) - 1;
//	int i = 0;
//	while (arr[i] == arr[h] && i <= h)
//	{
//		i++; h--;
//	}
//	if (i > h)
//	{
//		cout << "Y";
//	}
//	else
//	{
//		cout << "N";
//	}
//	return 0;
//}